/*********************************************************************************************************
* 模块名称：RCC.c
* 摘    要：RCC模块，包含各种时钟的配置
* 当前版本：1.0.0
* 作    者：
* 完成日期：2021年07月01日
* 内    容：
* 注    意：
**********************************************************************************************************
* 取代版本：
* 作    者：
* 完成日期：
* 修改内容:
* 修改文件：
*********************************************************************************************************/

/*********************************************************************************************************
*                                              包含头文件
*********************************************************************************************************/
#include "RCU.h"
#include "gd32f30x_conf.h"

/*********************************************************************************************************
*                                              宏定义
*********************************************************************************************************/

/*********************************************************************************************************
*                                              枚举结构体
*********************************************************************************************************/

/*********************************************************************************************************
*                                              内部变量定义
*********************************************************************************************************/

/*********************************************************************************************************
*                                              内部函数声明
*********************************************************************************************************/
static  void  ConfigRCU(void);  //配置RCU

/*********************************************************************************************************
*                                              内部函数实现
*********************************************************************************************************/

/*********************************************************************************************************
* 函数名称：ConfigRCU
* 函数功能：配置RCU
* 输入参数：void
* 输出参数：void
* 返 回 值：void
* 创建日期：2021年07月01日
* 注    意：配置的时钟如下：
*           （1）PLLCLK（PLL时钟）           = 120MHz
*           （2）SYSCLK（系统时钟）          = 120MHz
*           （3）HCLK（AHB总线时钟）         = 120MHz
*           （4）PCLK1（APB1总线时钟）       = 60MHz
*           （5）PCLK2（APB2总线时钟）       = 120MHz
            （6）RCU_HXTAL(外部高速晶振）    = 12MHz
*********************************************************************************************************/
static void ConfigRCU(void)
{
    ErrStatus HXTALStartUpStatus;

    rcu_deinit();                                       //RCU配置恢复默认值

    rcu_osci_on(RCU_HXTAL);                             //使能高速外部晶振(12MHz)

    HXTALStartUpStatus = rcu_osci_stab_wait(RCU_HXTAL); //等待外部晶振稳定

    if (HXTALStartUpStatus == SUCCESS) {                //外部晶振已经稳定
        fmc_wscnt_set(WS_WSCNT_1);

        rcu_ahb_clock_config(RCU_AHB_CKSYS_DIV1);        //设置高速AHB时钟（HCLK） = CK_SYS

        rcu_apb2_clock_config(RCU_APB2_CKAHB_DIV1);      //设置高速APB2时钟（PCLK2） = AHB

        rcu_apb1_clock_config(RCU_APB1_CKAHB_DIV2);      //设置低速APB1时钟（PCLK1） = AHB/2

        //设置锁相环PLL = HXTAL / 1 * 10 = 120 MHz
        rcu_pllpresel_config(RCU_PLLPRESRC_HXTAL);              //选择外部高速晶振

        rcu_predv0_config(RCU_PREDV0_DIV1);                     //12MHz 1分频

        rcu_pll_config(RCU_PLLSRC_HXTAL_IRC48M, RCU_PLL_MUL10); //10倍频

        rcu_osci_on(RCU_PLL_CK);                                //打开锁相环

        //等待锁相环稳定
        while (0U == rcu_flag_get(RCU_FLAG_PLLSTB)) {
        }

        //选择PLL作为系统时钟
        rcu_system_clock_source_config(RCU_CKSYSSRC_PLL);

        //等待PLL成功用于系统时钟
        while (0U == rcu_system_clock_source_get()) {
        }
    }
}

/*********************************************************************************************************
*                                              API函数实现
*********************************************************************************************************/
/*********************************************************************************************************
* 函数名称：InitRCU
* 函数功能：初始化RCU模块
* 输入参数：void
* 输出参数：void
* 返 回 值：void
* 创建日期：2021年07月01日
* 注    意：
*********************************************************************************************************/
void InitRCU(void)
{
    ConfigRCU();  //配置RCU
}
